<%  
    //->Hash对象
    var Hash=Class.create
    (
        Enumerable,
        (
            function()
            {
                if
                (
                    function()
                    {
                        var i=0,Test=function(value){ this.key=value };
                        Test.prototype.key='foo';
                        for(var property in new Test('bar')) i++;
                            return i > 1;
                    }()
                ) 
                {
                    function each(iterator) 
                    {
                        var cache = [];
                        for (var key in this._object) 
                        {
                            var value = this._object[key];
                            if (cache.include(key)) continue;
                            cache.push(key);
                            var pair = [key, value];
                            pair.key = key;
                            pair.value = value;
                            iterator(pair);
                        }
                    }
                } 
                else 
                {
                    function each(iterator) 
                    {
                        for (var key in this._object) 
                        {
                            var value = this._object[key], pair = [key, value];
                            pair.key = key;
                            pair.value = value;
                            iterator(pair);
                        }
                    }
                }
                    
                function toQueryPair(key,value) 
                {
                    if (Object.isUndefined(value)) return key;
                    return key + '=' + encodeURIComponent(String.interpret(value));
                }
                
                return {
                    initialize:function(object) 
                    {
                        this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
                    },
                    _each:each,                    
                    set:function(key, value) 
                    {
                        return this._object[key] = value;
                    },                    
                    get: function(key) 
                    {
                        return this._object[key];
                    },                    
                    unset: function(key) 
                    {
                        var value = this._object[key];
                        delete this._object[key];
                        return value;
                    },                    
                    toObject: function() 
                    {
                        return Object.clone(this._object);
                    },                    
                    keys: function() 
                    {
                        return this.pluck('key');
                    },                    
                    values: function() 
                    {
                        return this.pluck('value');
                    },                    
                    index: function(value) 
                    {
                        var match = this.detect(function(pair) {
                        return pair.value === value;
                        });
                        return match && match.key;
                    },                    
                    merge: function(object) 
                    {
                        return this.clone().update(object);
                    },                    
                    update: function(object) 
                    {
                        return new Hash(object).inject(this, function(result, pair) {
                        result.set(pair.key, pair.value);
                        return result;
                        });
                    },                    
                    toQueryString: function() 
                    {
                        return this.map(function(pair) {
                        var key = encodeURIComponent(pair.key), values = pair.value;
                        
                        if (values && typeof values == 'object') {
                        if (Object.isArray(values))
                        return values.map(toQueryPair.curry(key)).join('&');
                        }
                        return toQueryPair(key, values);
                        }).join('&');
                    },                    
                    inspect: function() 
                    {
                        return '#<Hash:{' + this.map(function(pair) {
                        return pair.map(Object.inspect).join(': ');
                        }).join(', ') + '}>';
                    },                    
                    toJSON: function() 
                    {
                        return Object.toJSON(this.toObject());
                    },                    
                    clone: function() 
                    {
                        return new Hash(this);
                    }
                }
            }
        )()
    );    
    Hash.prototype.toTemplateReplacements=Hash.prototype.toObject;
    Hash.from=$H;    
%>